/**
 * Created by utkin on 28.08.14.
 */

$(function () {
    var subscribeUrl = $('span#subscribeUrl').attr('value');

    if (subscribeUrl === undefined) {
		return;
	}

    LongPolling.subUrl = subscribeUrl;
    LongPolling.init();
    
    
    /**
     * Вызов обработчика события о изменении статуса пользователя
     */
    $('body').on('onlineChange', function (event, data) {
    	if (data['state'] == 1) {
	    	$('[data-online-subscriber=' + data['subscriber'] + ']').removeClass('hidden');
        	$('[data-jbh-subscriber=' + data['subscriber'] + ']').addClass('hidden');    		
    	} else if (data['state'] == -1) {
	    	$('[data-online-subscriber=' + data['subscriber'] + ']').addClass('hidden');
        	$('[data-jbh-subscriber=' + data['subscriber'] + ']').removeClass('hidden');    		
    	} else {
    		$('[data-online-subscriber=' + data['subscriber'] + ']').addClass('hidden');    		
    		$('[data-jbh-subscriber=' + data['subscriber'] + ']').addClass('hidden');    		
    	}
    });

    
});


var LongPolling = {
    etag: 0,
    time: null,
    subUrl: '',

    init: function () {
        var $this = this, xhr;
        if ($this.time === null) {
            //$this.time = $this.dateToUTCString(new Date());
            var d = new Date();
            $this.time = d.toUTCString();
        }

        if (window.XDomainRequest) {
            // Если IE, запускаем работу чуть позже (из-за бага IE8)
            setTimeout(function () {
                $this.poll_IE($this);
            }, 2000);

        } else {
            // Создает XMLHttpRequest объект
            mcXHR = xhr = new XMLHttpRequest();
            xhr.onreadystatechange = xhr.onload = function () {

                if (4 === xhr.readyState) {

					if (xhr.status === 0
						|| (xhr.status > 0 && xhr.status != 200 && xhr.status != 304)) {

						if (window.XDomainRequest) {
							setTimeout(function () {$this.poll_IE($this);}, 60000);
						} else {
							setTimeout(function () {$this.poll($this, xhr);}, 60000);
						}

                        return;
					}

                    // Если пришло сообщение
                    if (200 === xhr.status && xhr.responseText.length > 0) {

                        // Берем Etag и Last-Modified из Header ответа
                        $this.etag = xhr.getResponseHeader('Etag');
                        $this.time = xhr.getResponseHeader('Last-Modified');

                        // Вызываем обработчик сообщения
                        $this.action(xhr.responseText);
                    }
                    
                    $this.poll($this, xhr);

                }
            };

            // Начинаем long polling
            $this.poll($this, xhr);
        }
    },

    poll: function ($this, xhr) {
        var timestamp = (new Date()).getTime(),
            //url = this.subUrl + this.subID + '?callback=?&v=' + timestamp;
            url = this.subUrl;
        // timestamp помогает защитить от кеширования в браузерах

        xhr.open('GET', url, true);
        xhr.setRequestHeader("If-None-Match", $this.etag);
        xhr.setRequestHeader("If-Modified-Since", $this.time);
        xhr.send();
    },

    // То же самое что и poll(), только для IE
    poll_IE: function ($this) {
        var xhr = new window.XDomainRequest();
        var timestamp = (new Date()).getTime(),
            //url = this.subUrl + this.subID + '?callback=?&v=' + timestamp;
            url = this.subUrl;

        xhr.onprogress = function () {};
        xhr.onload = function () {
            $this.action(xhr.responseText);
            $this.poll_IE($this);
        };
        xhr.onerror = function () {
            $this.poll_IE($this);
        };
        xhr.open('GET', url, true);
        xhr.send();
    },

    action: function (data) {
        try {
			var responseString = '[' + data.substr(0, data.length-1) + ']';
            var response = $.parseJSON(responseString);
			$.each(response, function(index, dataPart) {
				// console.log(response.eventData);
				if (dataPart.eventName && dataPart.eventData) {
					$('body').trigger(dataPart.eventName, dataPart.eventData);
				}
			});
        } catch (e) {

        }
    }

//    valueToTwoDigits: function (value) {
//        return ((value < 10) ? '0' : '') + value;
//    },
//
//    // представление даты в виде UTC
//    dateToUTCString: function () {
//        var date = new Date();
//        var time = this.valueToTwoDigits(date.getUTCHours())
//            + ':' + this.valueToTwoDigits(date.getUTCMinutes())
//            + ':' + this.valueToTwoDigits(date.getUTCSeconds());
//        return this.days[date.getUTCDay()] + ', '
//            + this.valueToTwoDigits(date.getUTCDate()) + ' '
//            + this.months[date.getUTCMonth()] + ' '
//            + date.getUTCFullYear() + ' ' + time + ' GMT';
//    },
//
//    days: [1,2,3,4],
//    months: [1,2,3,4,5,6,7]

}